Packages

library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ───────────────────────────────────────────────────── tidyverse 1.3.2 ──✔ ggplot2 3.4.0     ✔ purrr   1.0.1
✔ tibble  3.1.8     ✔ dplyr   1.1.0
✔ tidyr   1.3.0     ✔ stringr 1.5.0
✔ readr   2.1.3     ✔ forcats 1.0.0── Conflicts ──────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
library(sf)
Linking to GEOS 3.11.0, GDAL 3.5.3, PROJ 9.1.0; sf_use_s2() is TRUE
library(here)
here() starts at /Users/ramkripa/Desktop/projects/emdat_proj
library(weed)
library(rnaturalearth)
library(rnaturalearthdata)

Attaching package: ‘rnaturalearthdata’

The following object is masked from ‘package:rnaturalearth’:

    countries110

Loading In the Data

emdat <- read_csv(here("full_emdat_geocoded_finally.csv"))
Warning: One or more parsing issues, call `problems()` on your data frame for details, e.g.:
  dat <- vroom(...)
  problems(dat)Rows: 74035 Columns: 51── Column specification ──────────────────────────────────────────────────────────────────────
Delimiter: ","
chr  (27): Dis No, Seq, Disaster Group, Disaster Subgroup, Disaster Type, Disaster Subtype...
dbl  (18): Year, Dis Mag Value, Start Year, Start Month, Start Day, End Year, End Month, E...
lgl   (5): Glide, Aid Contribution, Reconstruction Costs ('000 US$), Admin1 Code, uncertai...
time  (1): Local Time
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

How many disasters were located?

How many locations were located?

All types of disasters

Restrict to dry and wet hydrological disasters

dry_list <- c("Drought", "Extreme temperature", "Wildfire")
wet_list <- c("Flood", "Landslide", "Storm")

emdat_hydrological <- emdat %>%
  filter((`Disaster Type` %in% dry_list) || (`Disaster Type` %in% wet_list)) %>%
  mutate(dry = (`Disaster Type` %in% dry_list), wet = (`Disaster Type` %in% wet_list))
Warning: There were 2 warnings in `filter()`.
The first warning was:
ℹ In argument: `(`Disaster Type` %in% dry_list) || ...`.
Caused by warning in `` (`Disaster Type` %in% dry_list) || (`Disaster Type` %in% wet_list) ``:
! 'length(x) = 74035 > 1' in coercion to 'logical(1)'
ℹ Run ]8;;ide:run:dplyr::last_dplyr_warnings()dplyr::last_dplyr_warnings()]8;; to see the 1 remaining warning.

ENSO data

emdat_hydrological_enso %>%
  filter(!is.na(enso_Value)) %>%
  filter(!is.na(wet)) %>%
  mutate(enso_positive = (enso_Value > 0)) %>%
  group_by(`Dis No`) %>%
  summarize(enso_pos = any(enso_positive),enso_val = mean(enso_Value), is_wet = any(wet)) %>%
  ggplot(mapping = aes(x = enso_val, fill = is_wet)) +
    geom_histogram(stat = "density") +
    facet_grid(~is_wet) +
  ggtitle("Counts of Disasters compared to value of ONI with wet disasters in Blue and Dry in Red")
Warning: Ignoring unknown parameters: `binwidth`, `bins`, and `pad`

## calculate relative risk within each box
### create boxes

resy <- 2

emdat_hydrological_enso %>%
  left_join(event_num_months, by = c("Event")) %>%
  filter(!is.na(enso_Value)) %>%
  filter(!is.na(wet)) %>%
  filter(!is.na(lat)) %>%
  mutate(wet_factor = as_factor(wet)) %>%
  mutate(Event_factor = fct_recode(as_factor(Event), no_event = "N", negative = "-", positive = "+")) %>%
  mutate(wet_string = fct_recode(wet_factor, wet_disasters = "TRUE", dry_disasters = "FALSE")) %>%
  mutate(lat_box = (as.integer(lat) %/% resy) * resy , lng_box = (as.integer(lng) %/% resy) * resy) %>%
  mutate(dis_no_factor = as_factor(`Dis No`)) %>%
  group_by(lat_box, lng_box, Event_factor, wet_string) %>%
  summarize(num_months = first(num_months), num_disasters = n_distinct(dis_no_factor)) %>%
  mutate(disaster_rate = num_disasters / num_months) %>%
  pivot_wider(id_cols = c(lat_box, lng_box), names_from = c(Event_factor, wet_string), values_from = c(disaster_rate), values_fill = 0) %>%
  mutate(positive_wet_relative_risk = positive_wet_disasters / no_event_wet_disasters, 
         negative_wet_relative_risk = negative_wet_disasters / no_event_wet_disasters, 
         positive_dry_relative_risk =  positive_dry_disasters / no_event_dry_disasters,
         negative_dry_relative_risk = negative_dry_disasters / no_event_dry_disasters) %>%
  select(lat_box, lng_box, positive_wet_relative_risk, negative_wet_relative_risk, positive_dry_relative_risk, negative_dry_relative_risk) %>%
  pivot_longer(cols = c(positive_wet_relative_risk, negative_wet_relative_risk, positive_dry_relative_risk, negative_dry_relative_risk), names_to = 'risk', values_to = 'value') %>%
  mutate(risk_factor = as_factor(risk), values_cleaned = if_else(is.infinite(value), 18, value)) %>%
  mutate(relative_risk_cleaned = if_else(is.nan(values_cleaned), 0, values_cleaned)) %>%
  ggplot() +
  geom_sf(data = world_map) +
  geom_tile(mapping = aes(x = lng_box, y = lat_box, fill = relative_risk_cleaned, width = resy)) +
  scale_fill_gradient(low = 'white', high = 'red') +
  facet_grid(rows = vars(risk_factor))+
  ggtitle("Relative risk plot using calculations of the form [{num_disasters_positive_wet / num_months_positive} / {num_disasters_no_event_wet / num_months_no_event}]")
`summarise()` has grouped output by 'lat_box', 'lng_box', 'Event_factor'. You can override using the `.groups` argument.

## calculate percent of total disasters within each box
### create boxes 2x2

resy <- 2

emdat_hydrological_enso %>%
  left_join(event_num_months, by = c("Event")) %>%
  filter(!is.na(enso_Value)) %>%
  filter(!is.na(wet)) %>%
  filter(!is.na(lat)) %>%
  mutate(wet_factor = as_factor(wet)) %>%
  mutate(Event_factor = fct_recode(as_factor(Event), no_event = "N", negative = "-", positive = "+")) %>%
  mutate(wet_string = fct_recode(wet_factor, wet_disasters = "TRUE", dry_disasters = "FALSE")) %>%
  mutate(lat_box = (as.integer(lat) %/% resy) * resy , lng_box = (as.integer(lng) %/% resy) * resy) %>%
  mutate(dis_no_factor = as_factor(`Dis No`)) %>%
  group_by(lat_box, lng_box, Event_factor, wet_string) %>%
  summarize(num_months = first(num_months), num_disasters = n_distinct(dis_no_factor)) %>%
  mutate(disaster_rate = num_disasters / num_months) %>%
  pivot_wider(id_cols = c(lat_box, lng_box), names_from = c(Event_factor, wet_string), values_from = c(disaster_rate), values_fill = 0) %>%
  mutate(positive_wet_percent = positive_wet_disasters / (no_event_wet_disasters + positive_wet_disasters + negative_wet_disasters) , 
         negative_wet_percent = negative_wet_disasters / (no_event_wet_disasters + positive_wet_disasters + negative_wet_disasters), 
         positive_dry_percent =  positive_dry_disasters / (no_event_dry_disasters + positive_dry_disasters + negative_dry_disasters),
         negative_dry_percent =  negative_dry_disasters / (no_event_dry_disasters + positive_dry_disasters + negative_dry_disasters)
         ) %>%
  select(lat_box, lng_box, positive_wet_percent, negative_wet_percent, positive_dry_percent, negative_dry_percent) %>%
  pivot_longer(cols = c(positive_wet_percent, negative_wet_percent, positive_dry_percent, negative_dry_percent), names_to = 'typey', values_to = 'value') %>%
  mutate(type_factor = as_factor(typey)) %>%
  ggplot() +
  geom_sf(data = world_map) +
  geom_tile(mapping = aes(x = lng_box, y = lat_box, fill = value, width = resy)) +
  scale_fill_gradient(low = 'white', high = 'red') +
  facet_grid(rows = vars(type_factor))+
  ggtitle("Disaster Percent plot using calculations of the form [positive_wet / all_wet]")
`summarise()` has grouped output by 'lat_box', 'lng_box', 'Event_factor'. You can override using the `.groups` argument.

LS0tCnRpdGxlOiAiRU5TTyBhbmFseXNpcyBuZXciCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAoKIyMgUGFja2FnZXMKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShzZikKbGlicmFyeShoZXJlKQpsaWJyYXJ5KHdlZWQpCmxpYnJhcnkocm5hdHVyYWxlYXJ0aCkKbGlicmFyeShybmF0dXJhbGVhcnRoZGF0YSkKYGBgCgojIyBMb2FkaW5nIEluIHRoZSBEYXRhCgpgYGB7cn0KZW1kYXQgPC0gcmVhZF9jc3YoaGVyZSgiZnVsbF9lbWRhdF9nZW9jb2RlZF9maW5hbGx5LmNzdiIpKQpgYGAKIyBIb3cgbWFueSBkaXNhc3RlcnMgd2VyZSBsb2NhdGVkPwoKYGBge3J9CmVtZGF0ICU+JQogIHBlcmNlbnRfbG9jYXRlZF9kaXNhc3RlcnMocGxvdF9yZXN1bHQ9RkFMU0UpCmBgYAoKIyBIb3cgbWFueSBsb2NhdGlvbnMgd2VyZSBsb2NhdGVkPwoKYGBge3J9CmVtZGF0ICU+JQogIHBlcmNlbnRfbG9jYXRlZF9sb2NhdGlvbnMocGxvdF9yZXN1bHQ9RkFMU0UpCmBgYAojIEFsbCB0eXBlcyBvZiBkaXNhc3RlcnMKCmBgYHtyfQplbWRhdCAlPiUKICBncm91cF9ieShgRGlzYXN0ZXIgVHlwZWApICU+JQogIGNvdW50KCkKYGBgCgojIFJlc3RyaWN0IHRvIGRyeSBhbmQgd2V0IGh5ZHJvbG9naWNhbCBkaXNhc3RlcnMKCmBgYHtyfQpkcnlfbGlzdCA8LSBjKCJEcm91Z2h0IiwgIkV4dHJlbWUgdGVtcGVyYXR1cmUiLCAiV2lsZGZpcmUiKQp3ZXRfbGlzdCA8LSBjKCJGbG9vZCIsICJMYW5kc2xpZGUiLCAiU3Rvcm0iKQoKZW1kYXRfaHlkcm9sb2dpY2FsIDwtIGVtZGF0ICU+JQogIGZpbHRlcihgRGlzYXN0ZXIgVHlwZWAgJWluJSBjKGRyeV9saXN0LCB3ZXRfbGlzdCkpICU+JQogIG11dGF0ZShkcnkgPSAoYERpc2FzdGVyIFR5cGVgICVpbiUgZHJ5X2xpc3QpLCB3ZXQgPSAoYERpc2FzdGVyIFR5cGVgICVpbiUgd2V0X2xpc3QpKQpgYGAKCmBgYHtyfQplbWRhdF9oeWRyb2xvZ2ljYWwgJT4lCiAgZ3JvdXBfYnkoYERpc2FzdGVyIFR5cGVgKSAlPiUKICBjb3VudCgpCmBgYAoKIyBFTlNPIGRhdGEKCmBgYHtyfQplbnNvX2RhdGEgPC0gcmVhZF9jc3YoaGVyZSgiZGF0YSIsImVuc29fZGF0YV9jb3B5Mi5jc3YiKSkKZW5zb19kYXRhICU+JQogIGdyb3VwX2J5KEV2ZW50KSAlPiUKICBjb3VudCgpCmBgYAoKYGBge3J9CmVtZGF0X2h5ZHJvbG9naWNhbF9lbnNvIDwtIGVtZGF0X2h5ZHJvbG9naWNhbCAlPiUKICBmdWxsX2pvaW4oZW5zb19kYXRhLCBieSA9IGMoIlllYXIiID0gIlllYXIiLCAiU3RhcnQgTW9udGgiID0gIk1vbnRoTnVtIikpICU+JQogIHJlbmFtZSgiZW5zb19WYWx1ZSIgPSAiVmFsdWUiKSAKYGBgCgpgYGB7cn0KZW1kYXRfaHlkcm9sb2dpY2FsX2Vuc28gJT4lCiAgZmlsdGVyKCFpcy5uYShlbnNvX1ZhbHVlKSkgJT4lCiAgZmlsdGVyKCFpcy5uYSh3ZXQpKSAlPiUKICBtdXRhdGUoZW5zb19wb3NpdGl2ZSA9IChlbnNvX1ZhbHVlID4gMCkpICU+JQogIGdyb3VwX2J5KGBEaXMgTm9gKSAlPiUKICBzdW1tYXJpemUoZW5zb19wb3MgPSBhbnkoZW5zb19wb3NpdGl2ZSksZW5zb192YWwgPSBtZWFuKGVuc29fVmFsdWUpLCBpc193ZXQgPSBhbnkod2V0KSkgJT4lCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGVuc29fdmFsLCBmaWxsID0gaXNfd2V0KSkgKwogICAgZ2VvbV9oaXN0b2dyYW0oc3RhdCA9ICJkZW5zaXR5IikgKwogICAgZmFjZXRfZ3JpZCh+aXNfd2V0KSArCiAgZ2d0aXRsZSgiQ291bnRzIG9mIERpc2FzdGVycyBjb21wYXJlZCB0byB2YWx1ZSBvZiBPTkkgd2l0aCB3ZXQgZGlzYXN0ZXJzIGluIEJsdWUgYW5kIERyeSBpbiBSZWQiKQpgYGAKYGBge3J9CmVtZGF0X2h5ZHJvbG9naWNhbF9lbnNvICU+JQogIGZpbHRlcighaXMubmEoZW5zb19WYWx1ZSkpICU+JQogIGZpbHRlcighaXMubmEod2V0KSkgJT4lCiAgI211dGF0ZShlbnNvX3Bvc2l0aXZlID0gKGVuc29fVmFsdWUgPiAwKSkgJT4lCiAgZ3JvdXBfYnkoYERpcyBOb2ApICU+JQogIHN1bW1hcml6ZShlbnNvX2V2ZW50ID0gZmlyc3QoRXZlbnQpLGVuc29fdmFsID0gbWVhbihlbnNvX1ZhbHVlKSwgaXNfd2V0ID0gYW55KHdldCksIGlzX2RyeSA9IGFueShkcnkpKSAlPiUKICBtdXRhdGUoaXNfd2V0X251bSA9IGFzLm51bWVyaWMoaXNfd2V0KSwgaXNfZHJ5X251bSA9IGFzLm51bWVyaWMoaXNfZHJ5KSkgJT4lCiAgZ3JvdXBfYnkoZW5zb19ldmVudCkgJT4lCiAgc3VtbWFyaXplKG51bV9kaXNhc3RlcnNfd2V0ID0gc3VtKGlzX3dldF9udW0pLCBudW1fZGlzYXN0ZXJzX2RyeSA9IHN1bShpc19kcnlfbnVtKSkKYGBgCmBgYHtyfQp3b3JsZF9tYXAgPC0gcm5hdHVyYWxlYXJ0aDo6bmVfY291bnRyaWVzKHNjYWxlID0gIm1lZGl1bSIsIHJldHVybmNsYXNzID0gInNmIikKCmVtZGF0X2h5ZHJvbG9naWNhbF9lbnNvICU+JQogIGZpbHRlcighaXMubmEoZW5zb19WYWx1ZSkpICU+JQogIGZpbHRlcighaXMubmEod2V0KSkgJT4lCiAgZmlsdGVyKCFpcy5uYShsYXQpKSAlPiUKICBtdXRhdGUoZW5zb19wb3NpdGl2ZSA9IChlbnNvX1ZhbHVlID4gMCkpICU+JQogIG11dGF0ZSh3ZXRfZmFjdG9yID0gYXNfZmFjdG9yKHdldCkpICU+JQogIG11dGF0ZSh3ZXRfc3RyaW5nID0gZmN0X3JlY29kZSh3ZXRfZmFjdG9yLCB3ZXRfZGlzYXN0ZXJzID0gIlRSVUUiLCBkcnlfZGlzYXN0ZXJzID0gIkZBTFNFIikpICU+JQogIHNlbGVjdChsbmcsIGxhdCwgZW5zb19WYWx1ZSwgd2V0X3N0cmluZykgJT4lCiAgI2hlYWQobiA9IDUwTCkgJT4lCiAgZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IHdvcmxkX21hcCkgKwogIGdlb21fdGlsZShtYXBwaW5nID0gYWVzKHggPSBsbmcsIHkgPSBsYXQsIGZpbGwgPSBlbnNvX1ZhbHVlLCB3aWR0aCA9IDIsIGhlaWdodCA9IDIpKSArCiAgc2NhbGVfZmlsbF9ncmFkaWVudDIobG93PSJibHVlIiwgbWlkID0gIndoaXRlIiwgaGlnaCA9ICJyZWQiKSArCiAgZmFjZXRfZ3JpZCh+d2V0X3N0cmluZykKICAKCmBgYApgYGB7cn0KCmVtZGF0X2h5ZHJvbG9naWNhbF9lbnNvICU+JQogIGZpbHRlcighaXMubmEoZW5zb19WYWx1ZSkpICU+JQogIGZpbHRlcighaXMubmEod2V0KSkgJT4lCiAgZmlsdGVyKCFpcy5uYShsYXQpKSAlPiUKICBtdXRhdGUod2V0X2ZhY3RvciA9IGFzX2ZhY3Rvcih3ZXQpKSAlPiUKICBtdXRhdGUoRXZlbnRfZmFjdG9yID0gZmN0X3JlY29kZShhc19mYWN0b3IoRXZlbnQpLCBub19ldmVudCA9ICJOIiwgbmVnYXRpdmUgPSAiLSIsIHBvc2l0aXZlID0gIisiKSkgJT4lCiAgbXV0YXRlKHdldF9zdHJpbmcgPSBmY3RfcmVjb2RlKHdldF9mYWN0b3IsIHdldF9kaXNhc3RlcnMgPSAiVFJVRSIsIGRyeV9kaXNhc3RlcnMgPSAiRkFMU0UiKSkgJT4lCiAgc2VsZWN0KGxuZywgbGF0LCBFdmVudF9mYWN0b3IsIHdldF9zdHJpbmcsIHdldCkgJT4lCiAgZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IHdvcmxkX21hcCkgKwogIGdlb21fdGlsZShtYXBwaW5nID0gYWVzKHggPSBsbmcsIHkgPSBsYXQsIHdpZHRoID0gMiwgaGVpZ2h0ID0gMiwgZmlsbCA9IDEsIGFscGhhID0gMC4wMDEpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyh3ZXRfc3RyaW5nKSwgcm93cyA9IHZhcnMoRXZlbnRfZmFjdG9yKSkKCmBgYApgYGB7cn0KCmV2ZW50X251bV9tb250aHMgPC0gZW5zb19kYXRhICU+JQogIGdyb3VwX2J5KEV2ZW50KSAlPiUKICBzdW1tYXJpemUobnVtX21vbnRocyA9IG4oKSkKCmVtZGF0X2h5ZHJvbG9naWNhbF9lbnNvICU+JQogIGxlZnRfam9pbihldmVudF9udW1fbW9udGhzLCBieSA9IGMoIkV2ZW50IikpICU+JQogIGZpbHRlcighaXMubmEoZW5zb19WYWx1ZSkpICU+JQogIGZpbHRlcighaXMubmEod2V0KSkgJT4lCiAgZmlsdGVyKCFpcy5uYShsYXQpKSAlPiUKICBtdXRhdGUod2V0X2ZhY3RvciA9IGFzX2ZhY3Rvcih3ZXQpKSAlPiUKICBtdXRhdGUoRXZlbnRfZmFjdG9yID0gZmN0X3JlY29kZShhc19mYWN0b3IoRXZlbnQpLCBub19ldmVudCA9ICJOIiwgbmVnYXRpdmUgPSAiLSIsIHBvc2l0aXZlID0gIisiKSkgJT4lCiAgbXV0YXRlKHdldF9zdHJpbmcgPSBmY3RfcmVjb2RlKHdldF9mYWN0b3IsIHdldF9kaXNhc3RlcnMgPSAiVFJVRSIsIGRyeV9kaXNhc3RlcnMgPSAiRkFMU0UiKSkgJT4lCiAgc2VsZWN0KGxuZywgbGF0LCBFdmVudF9mYWN0b3IsIHdldF9zdHJpbmcsIG51bV9tb250aHMpICU+JQogIGFkZF9yb3cobG5nID0gMSwgbGF0ID0gMSwgRXZlbnRfZmFjdG9yID0gJ25vX2V2ZW50Jywgd2V0X3N0cmluZyA9ICdkcnlfZGlzYXN0ZXJzJywgbnVtX21vbnRocyA9IDEpICU+JQogIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSB3b3JsZF9tYXApICsKICBnZW9tX3RpbGUobWFwcGluZyA9IGFlcyh4ID0gbG5nLCB5ID0gbGF0LCB3aWR0aCA9IDIsIGhlaWdodCA9IDIsIGFscGhhID0gMS9udW1fbW9udGhzLCBmaWxsID0gJ3JlZCcpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyh3ZXRfc3RyaW5nKSwgcm93cyA9IHZhcnMoRXZlbnRfZmFjdG9yKSkgKwogIGdndGl0bGUoIlNhbWUgcGxvdCBhcyBhYm92ZSBidXQgc2NhbGVkIGJ5IG51bSBtb250aHMiKQoKYGBgCgpgYGB7cn0KZW1kYXRfaHlkcm9sb2dpY2FsX2Vuc28gJT4lCiAgbGVmdF9qb2luKGV2ZW50X251bV9tb250aHMsIGJ5ID0gYygiRXZlbnQiKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShlbnNvX1ZhbHVlKSkgJT4lCiAgZmlsdGVyKCFpcy5uYSh3ZXQpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGxhdCkpICU+JQogIG11dGF0ZSh3ZXRfZmFjdG9yID0gYXNfZmFjdG9yKHdldCkpICU+JQogIG11dGF0ZShFdmVudF9mYWN0b3IgPSBmY3RfcmVjb2RlKGFzX2ZhY3RvcihFdmVudCksIG5vX2V2ZW50ID0gIk4iLCBuZWdhdGl2ZSA9ICItIiwgcG9zaXRpdmUgPSAiKyIpKSAlPiUKICBtdXRhdGUod2V0X3N0cmluZyA9IGZjdF9yZWNvZGUod2V0X2ZhY3Rvciwgd2V0X2Rpc2FzdGVycyA9ICJUUlVFIiwgZHJ5X2Rpc2FzdGVycyA9ICJGQUxTRSIpKSAlPiUKICBzZWxlY3QobG5nLCBsYXQsIEV2ZW50X2ZhY3Rvciwgd2V0X3N0cmluZywgbnVtX21vbnRocykgJT4lCiAgZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IHdvcmxkX21hcCkgKwogIHN0YXRfYmluXzJkKG1hcHBpbmcgPSBhZXMoeCA9IGxuZywgeSA9IGxhdCksIGJpbndpZHRoID0gYygyLDIpKSArCiAgc2NhbGVfZmlsbF9ncmFkaWVudCh0cmFucyA9ICdsb2cnLCBsb3cgPSAnd2hpdGUnLCBoaWdoID0gJ3JlZCcpICsgCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyh3ZXRfc3RyaW5nKSwgcm93cyA9IHZhcnMoRXZlbnRfZmFjdG9yKSkgKwogIGdndGl0bGUoIjJEIEhpc3RvZ3JhbSBDb3VudHMgIikKCmBgYApgYGB7cn0KCmVtZGF0X2h5ZHJvbG9naWNhbF9lbnNvICU+JQogIGxlZnRfam9pbihldmVudF9udW1fbW9udGhzLCBieSA9IGMoIkV2ZW50IikpICU+JQogIGZpbHRlcighaXMubmEoZW5zb19WYWx1ZSkpICU+JQogIGZpbHRlcighaXMubmEod2V0KSkgJT4lCiAgZmlsdGVyKCFpcy5uYShsYXQpKSAlPiUKICBtdXRhdGUod2V0X2ZhY3RvciA9IGFzX2ZhY3Rvcih3ZXQpKSAlPiUKICBtdXRhdGUoRXZlbnRfZmFjdG9yID0gZmN0X3JlY29kZShhc19mYWN0b3IoRXZlbnQpLCBub19ldmVudCA9ICJOIiwgbmVnYXRpdmUgPSAiLSIsIHBvc2l0aXZlID0gIisiKSkgJT4lCiAgbXV0YXRlKHdldF9zdHJpbmcgPSBmY3RfcmVjb2RlKHdldF9mYWN0b3IsIHdldF9kaXNhc3RlcnMgPSAiVFJVRSIsIGRyeV9kaXNhc3RlcnMgPSAiRkFMU0UiKSkgJT4lCiAgc2VsZWN0KGxuZywgbGF0LCBFdmVudF9mYWN0b3IsIHdldF9zdHJpbmcsIG51bV9tb250aHMpICU+JQogIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSB3b3JsZF9tYXApICsKICBzdGF0X2Jpbl8yZChtYXBwaW5nID0gYWVzKHggPSBsbmcsIHkgPSBsYXQsIGZpbGwgPSAuLmRlbnNpdHkuLiksIGJpbndpZHRoID0gYygyLDIpKSArCiAgc2NhbGVfZmlsbF9ncmFkaWVudCh0cmFucyA9ICdsb2cnLCBsb3cgPSAnd2hpdGUnLCBoaWdoID0gJ3JlZCcpICsgCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyh3ZXRfc3RyaW5nKSwgcm93cyA9IHZhcnMoRXZlbnRfZmFjdG9yKSkgKwogIGdndGl0bGUoIjJEIEhpc3RvZ3JhbSBEZW5zaXR5IikKCmBgYAoKYGBge3J9CgplbWRhdF9oeWRyb2xvZ2ljYWxfZW5zbyAlPiUKICBsZWZ0X2pvaW4oZXZlbnRfbnVtX21vbnRocywgYnkgPSBjKCJFdmVudCIpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGVuc29fVmFsdWUpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHdldCkpICU+JQogIGZpbHRlcighaXMubmEobGF0KSkgJT4lCiAgbXV0YXRlKHdldF9mYWN0b3IgPSBhc19mYWN0b3Iod2V0KSkgJT4lCiAgbXV0YXRlKEV2ZW50X2ZhY3RvciA9IGZjdF9yZWNvZGUoYXNfZmFjdG9yKEV2ZW50KSwgbm9fZXZlbnQgPSAiTiIsIG5lZ2F0aXZlID0gIi0iLCBwb3NpdGl2ZSA9ICIrIikpICU+JQogIG11dGF0ZSh3ZXRfc3RyaW5nID0gZmN0X3JlY29kZSh3ZXRfZmFjdG9yLCB3ZXRfZGlzYXN0ZXJzID0gIlRSVUUiLCBkcnlfZGlzYXN0ZXJzID0gIkZBTFNFIikpICU+JQogIHNlbGVjdChsbmcsIGxhdCwgRXZlbnRfZmFjdG9yLCB3ZXRfc3RyaW5nLCBudW1fbW9udGhzKSAlPiUKICBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gd29ybGRfbWFwKSArCiAgc3RhdF9iaW5fMmQobWFwcGluZyA9IGFlcyh4ID0gbG5nLCB5ID0gbGF0LCB3ZWlnaHQgPSAxL251bV9tb250aHMpLCBiaW53aWR0aCA9IGMoMiwyKSkgKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnQodHJhbnMgPSAnbG9nJywgbG93ID0gJ3doaXRlJywgaGlnaCA9ICdyZWQnKSArIAogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMod2V0X3N0cmluZyksIHJvd3MgPSB2YXJzKEV2ZW50X2ZhY3RvcikpICsKICBnZ3RpdGxlKCIyRCBIaXN0b2dyYW0gSW52ZXJzZSBXZWlnaHRlZCBieSBOdW0gTW9udGhzIikKCmBgYApgYGB7cn0KIyMgY2FsY3VsYXRlIHJlbGF0aXZlIHJpc2sgd2l0aGluIGVhY2ggYm94CiMjIyBjcmVhdGUgYm94ZXMgMngyCgpyZXN5IDwtIDIKCmVtZGF0X2h5ZHJvbG9naWNhbF9lbnNvICU+JQogIGxlZnRfam9pbihldmVudF9udW1fbW9udGhzLCBieSA9IGMoIkV2ZW50IikpICU+JQogIGZpbHRlcighaXMubmEoZW5zb19WYWx1ZSkpICU+JQogIGZpbHRlcighaXMubmEod2V0KSkgJT4lCiAgZmlsdGVyKCFpcy5uYShsYXQpKSAlPiUKICBtdXRhdGUod2V0X2ZhY3RvciA9IGFzX2ZhY3Rvcih3ZXQpKSAlPiUKICBtdXRhdGUoRXZlbnRfZmFjdG9yID0gZmN0X3JlY29kZShhc19mYWN0b3IoRXZlbnQpLCBub19ldmVudCA9ICJOIiwgbmVnYXRpdmUgPSAiLSIsIHBvc2l0aXZlID0gIisiKSkgJT4lCiAgbXV0YXRlKHdldF9zdHJpbmcgPSBmY3RfcmVjb2RlKHdldF9mYWN0b3IsIHdldF9kaXNhc3RlcnMgPSAiVFJVRSIsIGRyeV9kaXNhc3RlcnMgPSAiRkFMU0UiKSkgJT4lCiAgbXV0YXRlKGxhdF9ib3ggPSAoYXMuaW50ZWdlcihsYXQpICUvJSByZXN5KSAqIHJlc3kgLCBsbmdfYm94ID0gKGFzLmludGVnZXIobG5nKSAlLyUgcmVzeSkgKiByZXN5KSAlPiUKICBtdXRhdGUoZGlzX25vX2ZhY3RvciA9IGFzX2ZhY3RvcihgRGlzIE5vYCkpICU+JQogIGdyb3VwX2J5KGxhdF9ib3gsIGxuZ19ib3gsIEV2ZW50X2ZhY3Rvciwgd2V0X3N0cmluZykgJT4lCiAgc3VtbWFyaXplKG51bV9tb250aHMgPSBmaXJzdChudW1fbW9udGhzKSwgbnVtX2Rpc2FzdGVycyA9IG5fZGlzdGluY3QoZGlzX25vX2ZhY3RvcikpICU+JQogIG11dGF0ZShkaXNhc3Rlcl9yYXRlID0gbnVtX2Rpc2FzdGVycyAvIG51bV9tb250aHMpICU+JQogIHBpdm90X3dpZGVyKGlkX2NvbHMgPSBjKGxhdF9ib3gsIGxuZ19ib3gpLCBuYW1lc19mcm9tID0gYyhFdmVudF9mYWN0b3IsIHdldF9zdHJpbmcpLCB2YWx1ZXNfZnJvbSA9IGMoZGlzYXN0ZXJfcmF0ZSksIHZhbHVlc19maWxsID0gMCkgJT4lCiAgbXV0YXRlKHBvc2l0aXZlX3dldF9yZWxhdGl2ZV9yaXNrID0gcG9zaXRpdmVfd2V0X2Rpc2FzdGVycyAvIG5vX2V2ZW50X3dldF9kaXNhc3RlcnMsIAogICAgICAgICBuZWdhdGl2ZV93ZXRfcmVsYXRpdmVfcmlzayA9IG5lZ2F0aXZlX3dldF9kaXNhc3RlcnMgLyBub19ldmVudF93ZXRfZGlzYXN0ZXJzLCAKICAgICAgICAgcG9zaXRpdmVfZHJ5X3JlbGF0aXZlX3Jpc2sgPSAgcG9zaXRpdmVfZHJ5X2Rpc2FzdGVycyAvIG5vX2V2ZW50X2RyeV9kaXNhc3RlcnMsCiAgICAgICAgIG5lZ2F0aXZlX2RyeV9yZWxhdGl2ZV9yaXNrID0gbmVnYXRpdmVfZHJ5X2Rpc2FzdGVycyAvIG5vX2V2ZW50X2RyeV9kaXNhc3RlcnMpICU+JQogIHNlbGVjdChsYXRfYm94LCBsbmdfYm94LCBwb3NpdGl2ZV93ZXRfcmVsYXRpdmVfcmlzaywgbmVnYXRpdmVfd2V0X3JlbGF0aXZlX3Jpc2ssIHBvc2l0aXZlX2RyeV9yZWxhdGl2ZV9yaXNrLCBuZWdhdGl2ZV9kcnlfcmVsYXRpdmVfcmlzaykgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKHBvc2l0aXZlX3dldF9yZWxhdGl2ZV9yaXNrLCBuZWdhdGl2ZV93ZXRfcmVsYXRpdmVfcmlzaywgcG9zaXRpdmVfZHJ5X3JlbGF0aXZlX3Jpc2ssIG5lZ2F0aXZlX2RyeV9yZWxhdGl2ZV9yaXNrKSwgbmFtZXNfdG8gPSAncmlzaycsIHZhbHVlc190byA9ICd2YWx1ZScpICU+JQogIG11dGF0ZShyaXNrX2ZhY3RvciA9IGFzX2ZhY3RvcihyaXNrKSwgdmFsdWVzX2NsZWFuZWQgPSBpZl9lbHNlKGlzLmluZmluaXRlKHZhbHVlKSwgMTgsIHZhbHVlKSkgJT4lCiAgbXV0YXRlKHJlbGF0aXZlX3Jpc2tfY2xlYW5lZCA9IGlmX2Vsc2UoaXMubmFuKHZhbHVlc19jbGVhbmVkKSwgMCwgdmFsdWVzX2NsZWFuZWQpKSAlPiUKICBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gd29ybGRfbWFwKSArCiAgZ2VvbV90aWxlKG1hcHBpbmcgPSBhZXMoeCA9IGxuZ19ib3gsIHkgPSBsYXRfYm94LCBmaWxsID0gcmVsYXRpdmVfcmlza19jbGVhbmVkLCB3aWR0aCA9IHJlc3kpKSArCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAnd2hpdGUnLCBoaWdoID0gJ3JlZCcpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKHJpc2tfZmFjdG9yKSkrCiAgZ2d0aXRsZSgiUmVsYXRpdmUgcmlzayBwbG90IHVzaW5nIGNhbGN1bGF0aW9ucyBvZiB0aGUgZm9ybSBbe251bV9kaXNhc3RlcnNfcG9zaXRpdmVfd2V0IC8gbnVtX21vbnRoc19wb3NpdGl2ZX0gLyB7bnVtX2Rpc2FzdGVyc19ub19ldmVudF93ZXQgLyBudW1fbW9udGhzX25vX2V2ZW50fV0iKQogIAogIAoKYGBgCgpgYGB7cn0KIyMgY2FsY3VsYXRlIHBlcmNlbnQgb2YgdG90YWwgZGlzYXN0ZXJzIHdpdGhpbiBlYWNoIGJveAojIyMgY3JlYXRlIGJveGVzIDJ4MgoKcmVzeSA8LSAyCgplbWRhdF9oeWRyb2xvZ2ljYWxfZW5zbyAlPiUKICBsZWZ0X2pvaW4oZXZlbnRfbnVtX21vbnRocywgYnkgPSBjKCJFdmVudCIpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGVuc29fVmFsdWUpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHdldCkpICU+JQogIGZpbHRlcighaXMubmEobGF0KSkgJT4lCiAgbXV0YXRlKHdldF9mYWN0b3IgPSBhc19mYWN0b3Iod2V0KSkgJT4lCiAgbXV0YXRlKEV2ZW50X2ZhY3RvciA9IGZjdF9yZWNvZGUoYXNfZmFjdG9yKEV2ZW50KSwgbm9fZXZlbnQgPSAiTiIsIG5lZ2F0aXZlID0gIi0iLCBwb3NpdGl2ZSA9ICIrIikpICU+JQogIG11dGF0ZSh3ZXRfc3RyaW5nID0gZmN0X3JlY29kZSh3ZXRfZmFjdG9yLCB3ZXRfZGlzYXN0ZXJzID0gIlRSVUUiLCBkcnlfZGlzYXN0ZXJzID0gIkZBTFNFIikpICU+JQogIG11dGF0ZShsYXRfYm94ID0gKGFzLmludGVnZXIobGF0KSAlLyUgcmVzeSkgKiByZXN5ICwgbG5nX2JveCA9IChhcy5pbnRlZ2VyKGxuZykgJS8lIHJlc3kpICogcmVzeSkgJT4lCiAgbXV0YXRlKGRpc19ub19mYWN0b3IgPSBhc19mYWN0b3IoYERpcyBOb2ApKSAlPiUKICBncm91cF9ieShsYXRfYm94LCBsbmdfYm94LCBFdmVudF9mYWN0b3IsIHdldF9zdHJpbmcpICU+JQogIHN1bW1hcml6ZShudW1fbW9udGhzID0gZmlyc3QobnVtX21vbnRocyksIG51bV9kaXNhc3RlcnMgPSBuX2Rpc3RpbmN0KGRpc19ub19mYWN0b3IpKSAlPiUKICBtdXRhdGUoZGlzYXN0ZXJfcmF0ZSA9IG51bV9kaXNhc3RlcnMgLyBudW1fbW9udGhzKSAlPiUKICBwaXZvdF93aWRlcihpZF9jb2xzID0gYyhsYXRfYm94LCBsbmdfYm94KSwgbmFtZXNfZnJvbSA9IGMoRXZlbnRfZmFjdG9yLCB3ZXRfc3RyaW5nKSwgdmFsdWVzX2Zyb20gPSBjKGRpc2FzdGVyX3JhdGUpLCB2YWx1ZXNfZmlsbCA9IDApICU+JQogIG11dGF0ZShwb3NpdGl2ZV93ZXRfcGVyY2VudCA9IHBvc2l0aXZlX3dldF9kaXNhc3RlcnMgLyAobm9fZXZlbnRfd2V0X2Rpc2FzdGVycyArIHBvc2l0aXZlX3dldF9kaXNhc3RlcnMgKyBuZWdhdGl2ZV93ZXRfZGlzYXN0ZXJzKSAsIAogICAgICAgICBuZWdhdGl2ZV93ZXRfcGVyY2VudCA9IG5lZ2F0aXZlX3dldF9kaXNhc3RlcnMgLyAobm9fZXZlbnRfd2V0X2Rpc2FzdGVycyArIHBvc2l0aXZlX3dldF9kaXNhc3RlcnMgKyBuZWdhdGl2ZV93ZXRfZGlzYXN0ZXJzKSwgCiAgICAgICAgIHBvc2l0aXZlX2RyeV9wZXJjZW50ID0gIHBvc2l0aXZlX2RyeV9kaXNhc3RlcnMgLyAobm9fZXZlbnRfZHJ5X2Rpc2FzdGVycyArIHBvc2l0aXZlX2RyeV9kaXNhc3RlcnMgKyBuZWdhdGl2ZV9kcnlfZGlzYXN0ZXJzKSwKICAgICAgICAgbmVnYXRpdmVfZHJ5X3BlcmNlbnQgPSAgbmVnYXRpdmVfZHJ5X2Rpc2FzdGVycyAvIChub19ldmVudF9kcnlfZGlzYXN0ZXJzICsgcG9zaXRpdmVfZHJ5X2Rpc2FzdGVycyArIG5lZ2F0aXZlX2RyeV9kaXNhc3RlcnMpCiAgICAgICAgICkgJT4lCiAgc2VsZWN0KGxhdF9ib3gsIGxuZ19ib3gsIHBvc2l0aXZlX3dldF9wZXJjZW50LCBuZWdhdGl2ZV93ZXRfcGVyY2VudCwgcG9zaXRpdmVfZHJ5X3BlcmNlbnQsIG5lZ2F0aXZlX2RyeV9wZXJjZW50KSAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IGMocG9zaXRpdmVfd2V0X3BlcmNlbnQsIG5lZ2F0aXZlX3dldF9wZXJjZW50LCBwb3NpdGl2ZV9kcnlfcGVyY2VudCwgbmVnYXRpdmVfZHJ5X3BlcmNlbnQpLCBuYW1lc190byA9ICd0eXBleScsIHZhbHVlc190byA9ICd2YWx1ZScpICU+JQogIG11dGF0ZSh0eXBlX2ZhY3RvciA9IGFzX2ZhY3Rvcih0eXBleSkpICU+JQogIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSB3b3JsZF9tYXApICsKICBnZW9tX3RpbGUobWFwcGluZyA9IGFlcyh4ID0gbG5nX2JveCwgeSA9IGxhdF9ib3gsIGZpbGwgPSB2YWx1ZSwgd2lkdGggPSByZXN5KSkgKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gJ3doaXRlJywgaGlnaCA9ICdyZWQnKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyh0eXBlX2ZhY3RvcikpKwogIGdndGl0bGUoIkRpc2FzdGVyIFBlcmNlbnQgcGxvdCB1c2luZyBjYWxjdWxhdGlvbnMgb2YgdGhlIGZvcm0gW3Bvc2l0aXZlX3dldCAvIGFsbF93ZXRdIikKICAKICAKCmBgYA==